package com.coincalf.service;

import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.IService;
import com.coincalf.dto.*;
import com.coincalf.entity.EntrustOrder;
import com.coincalf.entity.Market;
import com.coincalf.framework.enums.OrderType;
import com.coincalf.framework.exception.GlobalDefaultException;
import com.coincalf.framework.http.Response;
import com.google.common.cache.LoadingCache;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 委托订单信息 服务类
 * </p>
 *
 * @author qiang
 * @since 2018-05-12
 */
public interface EntrustOrderService extends IService<EntrustOrder> {

    /**
     * 币币交易委托下单 委托下单请求参数
     *
     * @param market 交易对
     * @param order  委托订单
     * @param userId 用户ID
     */
    Response createEntrustOrder(Market market, CreateTradeOrderDTO order, long userId) throws GlobalDefaultException;

    /**
     * 币币交易撤销委托
     *
     * @param orderId 订单号
     * @param userId  用户ID
     */
    Market cancelEntrustOrder(long orderId, long userId) throws GlobalDefaultException;

    /**
     * 创新交易委托下单
     *
     * @param market 交易对
     * @param order  委托订单
     * @param userId 用户ID
     * @return
     */
    Response createForexOrder(Market market, CreateForexOrderDTO order, long userId);

    /**
     * 创新交易撤销委托
     *
     * @param orderId 订单号
     * @param userId  用户ID
     */
    Market cancelForexOrder(long orderId, long userId);

    /**
     * 查询未完成委托订单
     *
     * @param symbol 交易对标识符
     * @param userId 用户ID
     * @param page   查询条件及分页参数
     * @return
     */
    Page<TradeEntrustOrderDTO> queryEntrustOrder(String symbol, long userId, Page<EntrustOrder> page);

    /**
     * 查询历史委托订单
     *
     * @param symbol 交易对标识符
     * @param userId 用户ID
     * @param page   查询条件及分页参数
     * @return
     */
    Page<TradeEntrustOrderDTO> queryHistoryEntrustOrder(String symbol, long userId, Page<EntrustOrder> page);

    /**
     * 币币交易市场深度缓存实例
     *
     * @return
     */
    LoadingCache<Long, DepthsDTO> DEPTH_CACHE_INSTANCE();

    /**
     * 币币交易市场合并深度缓存实例
     *
     * @return
     */
    LoadingCache<Long, DepthsDTO> MERGE_LOW_DEPTH_CACHE_INSTANCE();

    /**
     * 币币交易市场合并深度缓存实例
     *
     * @return
     */
    LoadingCache<Long, DepthsDTO> MERGE_HIGH_DEPTH_CACHE_INSTANCE();

    /**
     * 今日委托（最新10个委托订单）
     *
     * @param userId 用户ID
     * @return
     */
    List<ForexEntrustOrderDTO> selectTodayList(long userId);

    /**
     * 获取持仓方向列表
     */
    List<Map<String, Object>> getEntrustType();

    /**
     * 成交订单统计
     */
    ResultDTO selectDealOrdersTotal(long agencyUserId);

    /**
     * 获取委托订单集合
     */
    Page<EntrustOrderDTO> selectOrders(Page<EntrustOrderDTO> page, long agencyUserId, String userName, long orderId, String typeId, long marketId, long parentId, String createTime);

    /**
     * 获取成交订单集合
     */
    Page<ForexDealOrderDTO> selectDealOrders(Page<ForexDealOrderDTO> page, long agencyUserId, String userName, long orderId, String typeId, long marketId, long parentId, String createTime);

    /**
     * 查询创新交易深度
     *
     * @param marketId 交易对ID
     * @return
     */
    List<BigDecimal> selectForexDepth(long marketId);

    /**
     * 更新委托单
     *
     * @param orderId    委托订单号
     * @param dealVolume 成交量
     * @param orderType  订单类型
     * @return
     */
    boolean modifyEntrustOrder(Long orderId, BigDecimal dealVolume, OrderType orderType);

    /**
     * 获取委托中买一订单价格
     *
     * @param marketId 市场主键id
     * @return
     */
    public BigDecimal selectBuyFirstPrice(Long marketId);

    /**
     * 获取委托中卖一订单价格
     *
     * @param marketId 市场主键id
     * @return
     */
    public BigDecimal selectSellFirstPrice(Long marketId);
}
